{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np \n",
    "import pandas as pd \n",
    "from sklearn.cluster import KMeans\n",
    "from transformers import AutoModel, AutoTokenizer\n",
    "import torch\n",
    "from sklearn.decomposition import PCA\n",
    "import matplotlib.pyplot as plt "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/transformers/tokenization_utils_base.py:1601: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be depracted in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n",
      "  warnings.warn(\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `beta` will be renamed internally to `bias`. Please use a different name to suppress this warning.\n",
      "A parameter name that contains `gamma` will be renamed internally to `weight`. Please use a different name to suppress this warning.\n"
     ]
    }
   ],
   "source": [
    "# 加载预训练的Bert模型和分词器\n",
    "tokenizr = AutoTokenizer.from_pretrained(\"bert-base-uncased\")\n",
    "model = AutoModel.from_pretrained(\"bert-base-uncased\")\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据准备：实例文档\n",
    "documents = [\n",
    "    \"机器学习是一个非常有趣的领域。\",\n",
    "    \"人工智能是未来的发展方向。\",\n",
    "    \"今天天气很好，适合出去散步。\",\n",
    "    \"我喜欢在周末去爬山。\",\n",
    "    \"深度学习模型需要大量的数据。\",\n",
    "    \"自然语言处理是人工智能的重要组成部分。\"\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 文本向量化\n",
    "def embed_text(text):\n",
    "    inputs = tokenizr(text, return_tensors=\"pt\", padding=True, truncation=True, max_length=128)\n",
    "    with torch.no_grad():\n",
    "        outputs = model(**inputs)\n",
    "    # 使用CLS token的输出作为句子的向量表示\n",
    "    return outputs.last_hidden_state[:, 0, :].numpy()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.18237038,  0.35050118, -0.53452796, ..., -0.39663997,\n",
       "         0.73709035,  0.09116175],\n",
       "       [-0.3305034 ,  0.3901231 , -0.53765494, ..., -0.4246339 ,\n",
       "         0.72257984,  0.07429284],\n",
       "       [-0.29553175,  0.3981566 , -0.47159046, ..., -0.40304404,\n",
       "         0.71192133,  0.00968653],\n",
       "       [-0.23210068,  0.4032757 , -0.4017987 , ..., -0.44375652,\n",
       "         0.6127985 ,  0.15116683],\n",
       "       [-0.17131566,  0.3501635 , -0.50535905, ..., -0.38822445,\n",
       "         0.75840336,  0.03955699],\n",
       "       [-0.2160143 ,  0.31379193, -0.49122733, ..., -0.35678273,\n",
       "         0.74487865,  0.093505  ]], dtype=float32)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将所有文档向量化\n",
    "document_embeddings = np.vstack([embed_text(doc) for doc in documents])\n",
    "document_embeddings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用K-means聚类\n",
    "num_clusters = 2 \n",
    "kmeans = KMeans(n_clusters=num_clusters, random_state=0).fit(document_embeddings)\n",
    "labels = kmeans.labels_\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "文档: 机器学习是一个非常有趣的领域。 \n",
      "所属聚类: 1\n",
      "\n",
      "文档: 人工智能是未来的发展方向。 \n",
      "所属聚类: 1\n",
      "\n",
      "文档: 今天天气很好，适合出去散步。 \n",
      "所属聚类: 1\n",
      "\n",
      "文档: 我喜欢在周末去爬山。 \n",
      "所属聚类: 0\n",
      "\n",
      "文档: 深度学习模型需要大量的数据。 \n",
      "所属聚类: 1\n",
      "\n",
      "文档: 自然语言处理是人工智能的重要组成部分。 \n",
      "所属聚类: 1\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 展示结果\n",
    "for i, doc in enumerate(documents):\n",
    "    print(f\"文档: {doc} \\n所属聚类: {labels[i]}\\n\")\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25991 (\\N{CJK UNIFIED IDEOGRAPH-6587}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26723 (\\N{CJK UNIFIED IDEOGRAPH-6863}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 32858 (\\N{CJK UNIFIED IDEOGRAPH-805A}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 31867 (\\N{CJK UNIFIED IDEOGRAPH-7C7B}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21487 (\\N{CJK UNIFIED IDEOGRAPH-53EF}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 35270 (\\N{CJK UNIFIED IDEOGRAPH-89C6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21270 (\\N{CJK UNIFIED IDEOGRAPH-5316}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26426 (\\N{CJK UNIFIED IDEOGRAPH-673A}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22120 (\\N{CJK UNIFIED IDEOGRAPH-5668}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 23398 (\\N{CJK UNIFIED IDEOGRAPH-5B66}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20064 (\\N{CJK UNIFIED IDEOGRAPH-4E60}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26159 (\\N{CJK UNIFIED IDEOGRAPH-662F}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 19968 (\\N{CJK UNIFIED IDEOGRAPH-4E00}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20010 (\\N{CJK UNIFIED IDEOGRAPH-4E2A}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 38750 (\\N{CJK UNIFIED IDEOGRAPH-975E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24120 (\\N{CJK UNIFIED IDEOGRAPH-5E38}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26377 (\\N{CJK UNIFIED IDEOGRAPH-6709}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 36259 (\\N{CJK UNIFIED IDEOGRAPH-8DA3}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 30340 (\\N{CJK UNIFIED IDEOGRAPH-7684}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 39046 (\\N{CJK UNIFIED IDEOGRAPH-9886}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22495 (\\N{CJK UNIFIED IDEOGRAPH-57DF}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 12290 (\\N{IDEOGRAPHIC FULL STOP}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20154 (\\N{CJK UNIFIED IDEOGRAPH-4EBA}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24037 (\\N{CJK UNIFIED IDEOGRAPH-5DE5}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26234 (\\N{CJK UNIFIED IDEOGRAPH-667A}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 33021 (\\N{CJK UNIFIED IDEOGRAPH-80FD}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26410 (\\N{CJK UNIFIED IDEOGRAPH-672A}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26469 (\\N{CJK UNIFIED IDEOGRAPH-6765}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21457 (\\N{CJK UNIFIED IDEOGRAPH-53D1}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 23637 (\\N{CJK UNIFIED IDEOGRAPH-5C55}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26041 (\\N{CJK UNIFIED IDEOGRAPH-65B9}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21521 (\\N{CJK UNIFIED IDEOGRAPH-5411}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20170 (\\N{CJK UNIFIED IDEOGRAPH-4ECA}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22825 (\\N{CJK UNIFIED IDEOGRAPH-5929}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 27668 (\\N{CJK UNIFIED IDEOGRAPH-6C14}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24456 (\\N{CJK UNIFIED IDEOGRAPH-5F88}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22909 (\\N{CJK UNIFIED IDEOGRAPH-597D}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 65292 (\\N{FULLWIDTH COMMA}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 36866 (\\N{CJK UNIFIED IDEOGRAPH-9002}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21512 (\\N{CJK UNIFIED IDEOGRAPH-5408}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20986 (\\N{CJK UNIFIED IDEOGRAPH-51FA}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21435 (\\N{CJK UNIFIED IDEOGRAPH-53BB}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25955 (\\N{CJK UNIFIED IDEOGRAPH-6563}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 27493 (\\N{CJK UNIFIED IDEOGRAPH-6B65}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25105 (\\N{CJK UNIFIED IDEOGRAPH-6211}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21916 (\\N{CJK UNIFIED IDEOGRAPH-559C}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 27426 (\\N{CJK UNIFIED IDEOGRAPH-6B22}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22312 (\\N{CJK UNIFIED IDEOGRAPH-5728}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 21608 (\\N{CJK UNIFIED IDEOGRAPH-5468}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26411 (\\N{CJK UNIFIED IDEOGRAPH-672B}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 29228 (\\N{CJK UNIFIED IDEOGRAPH-722C}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 23665 (\\N{CJK UNIFIED IDEOGRAPH-5C71}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 28145 (\\N{CJK UNIFIED IDEOGRAPH-6DF1}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 24230 (\\N{CJK UNIFIED IDEOGRAPH-5EA6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 27169 (\\N{CJK UNIFIED IDEOGRAPH-6A21}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22411 (\\N{CJK UNIFIED IDEOGRAPH-578B}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 38656 (\\N{CJK UNIFIED IDEOGRAPH-9700}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 35201 (\\N{CJK UNIFIED IDEOGRAPH-8981}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22823 (\\N{CJK UNIFIED IDEOGRAPH-5927}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 37327 (\\N{CJK UNIFIED IDEOGRAPH-91CF}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25968 (\\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25454 (\\N{CJK UNIFIED IDEOGRAPH-636E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 33258 (\\N{CJK UNIFIED IDEOGRAPH-81EA}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 28982 (\\N{CJK UNIFIED IDEOGRAPH-7136}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 35821 (\\N{CJK UNIFIED IDEOGRAPH-8BED}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 35328 (\\N{CJK UNIFIED IDEOGRAPH-8A00}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 22788 (\\N{CJK UNIFIED IDEOGRAPH-5904}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 29702 (\\N{CJK UNIFIED IDEOGRAPH-7406}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 37325 (\\N{CJK UNIFIED IDEOGRAPH-91CD}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 32452 (\\N{CJK UNIFIED IDEOGRAPH-7EC4}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 25104 (\\N{CJK UNIFIED IDEOGRAPH-6210}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 37096 (\\N{CJK UNIFIED IDEOGRAPH-90E8}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/root/miniconda3/envs/py311/lib/python3.11/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 20998 (\\N{CJK UNIFIED IDEOGRAPH-5206}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pcs = PCA(n_components=2)\n",
    "reduced_embeddings = pcs.fit_transform(document_embeddings)\n",
    "\n",
    "plt.scatter(reduced_embeddings[:, 0], reduced_embeddings[:, 1], c=labels)\n",
    "for i, txt in enumerate(documents):\n",
    "    plt.annotate(txt, (reduced_embeddings[i,0], reduced_embeddings[i, 1]))\n",
    "plt.title(\"文档聚类可视化\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py311",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
